import { View } from "ol";
import { TileGrid } from "ol/tilegrid";

/**
 * 天地图元数据查询 https://t0.tianditu.gov.cn/vec_w/wmts?request=GetCapabilities&service=wmts
 * 需要什么类型的数据替换 url 中的 vec_w 查询即可, 参考 http://lbs.tianditu.gov.cn/server/MapService.html
 *
 * 重要: Capabilities数据需要和地图服务厂商确认, 这些因素影响瓦片的对应关系, 包括以下
 *   - 使用的是经纬度投影还是球面墨卡托投影
 *   - 坐标系(projection)
 *   - 切片分辨率(resolutions), 意义为图上1px的距离表示实际距离的多少, lod中包含了level、resolution、scale等信息
 *   - 原点坐标(origin), 切片计算的起点, 用于确定在每一个比例尺下，行列号为(0,0)的切片的位置
 *   - 瓦片尺寸(tileSize), 切片地图每一个图片的大小
 *   - 区域范围(extent), 可选, 在 openlayers 中可以限制地图的显示的最大区域, 而不是全世界
 * 一般来说厂商会提供 getCapabilities 的 url, 访问后可以获取到这些信息
 *
 * 同时注意请求接口的边界数据适用于经纬度投影还是球面墨卡托投影
 */

/**
 * 坐标系标准
 *
 * 如果使用的是经纬度投影, 天地图使用的是EPSG:4490, openlayers不直接支持
 * 可以使用 EPSG:4326 替换 (openlayers直接支持), 两者坐标差异极小（厘米级）, 低精度场景可以近似等价，但高精度需替换
 *
 * 使用球面墨卡托投影时, 天地图使用的是 EPSG:3857, openlayers直接支持
 */
export const projection = "EPSG:4326"; // 用于视图经纬度,距离,面积计算
export const dataProjection = "EPSG:4326"; // 后端返回的地址坐标系标准
export const layerProjection = "EPSG:3857"; // 用于图层瓦片坐标计算

// 天地图球面墨卡托投影(EPSG:3857)分辨率
const resolutions = [
    156543.03392804097,
    78271.51696402048,
    39135.75848201024,
    19567.87924100512,
    9783.93962050256,
    4891.96981025128,
    2445.98490512564,
    1222.99245256282,
    611.49622628141,
    305.748113140705,
    152.8740565703525,
    76.43702828517625,
    38.21851414258813,
    19.109257071294063,
    9.554628535647032,
    4.777314267823516,
    2.388657133911758,
    1.194328566955879,
    0.5971642834779395,
];

// 天地图EPSG:4326经纬度投影分辨率
// const resolutions = [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.005493164063, 0.002746582031, 0.001373291016, 6.86645508e-4, 3.43322754e-4, 1.71661377e-4, 8.5830688e-5, 4.2915344e-5, 2.1457672e-5, 1.0728836e-5, 5.364418e-6, 2.682209e-6];

/**
 * 瓦片网格配置
 * 对于天地图瓦片接口都是标准的 WMTS 格式, 使用 openlayers 通过投影计算的默认设置就可以了, tileGrid可以不用配置
 * 这里做学习演示
 */
export const tileGrid = new TileGrid({
    origin: [-20037508.342789244, 20037508.342789244], // 天地图标准Web墨卡托原点
    extent: [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244], // 墨卡托全球范围
    // origin: [-180, 90], // 天地图标准EPSG:4326经纬度投影原点
    // extent: [-180, -90, 180, 90], // EPSG:4326全球范围
    resolutions,
    tileSize: [256, 256],
});

/**
 * 地图视图配置
 * 这里的 center 和 zoom 可以不用定义，因为在设置地图边界信息时(addGeoJson)时控制了中心点和缩放自动适应
 * 但为了代码的完整性和可读性，还是定义了一个初始
 */
export const view = new View({
    center: [117.222316, 31.822454], // 地图中心点 (经纬度)
    zoom: 5, // 初始缩放级别
    enableRotation: true, // 启用旋转, 某些投影（如 EPSG:3857）可能限制旋转功能, 默认启用
    projection,
});
